package OperationSystem.day1211;

import java.util.HashMap;
import java.util.Map;

//模拟url解析的过程

public class parseUrl {
    public static void main(String[] args) {
        String[] urlList = {
                "http://bitedu.vip/thread-809.htm",
                "http://fanyi.youdao.com/",
                "https://gitee.com/wuqing-town-sand/dashboard/codes",
                "https://i.csdn.net/#/uc/collection-list?type=1"
        };
        for (String str : urlList) {
            parse_url(str);
            System.out.println("===============");
        }
    }

    //定义协议与之对应的标准端口: 协议名称(key)：端口(value)
    private static Map<String, Integer> standardPort = new HashMap<>();

    static {
        standardPort.put("ssh", 22);
        standardPort.put("http", 80);
        standardPort.put("https", 443);
        standardPort.put("jdbc:mysql", 3306);
    }

    //1.协议
    //2.域名orIP
    //3.端口(可以省略)
    //4.路径
    //5.查询字符串(可以省略)
    private static void parse_url(String url) {
        //1.从url中找出协议部分——://
        int i = url.indexOf("://");
        String schema = url.substring(0, i);
        System.out.println(schema);


        String rest = url.substring(i + 3);//3就是://的长度

        //2.从url中找出整个的主机部分(域名+port)——/
        i = rest.indexOf("/");
        String host = rest.substring(0, i);
        rest = rest.substring(i);//保留/部分

        //3.把host部分的域名和端口进行分离—— ：
        String[] fragments = host.split(":");
        String domainOrIP;
        int port;
        if (fragments.length == 1) {//host部分没有携带端口
            domainOrIP = host;
            //没有考虑不认识的协议的情况
            port = standardPort.get(schema);
        } else {//host部分携带端口
            domainOrIP = fragments[0];
            port = Integer.parseInt(fragments[1]);
        }
        System.out.println(domainOrIP);
        System.out.println(port);

        //4.分离出path和queryString部分——？
        String path;
        String queryString;
        /*
        方法一:
        fragments = rest.split("\\?");  //记得对？进行转义，传入的正则表达式，而？在正则表达式中有特殊含义，所以需要转义
        if (fragments.length == 1) {
            path = rest;
            queryString = "";
        } else {
            path = fragments[0];
            queryString = fragments[1];
        }
        */
        i=rest.indexOf("?");
        if (i==-1){
            path=rest;
            queryString="";
        }else {
            path=rest.substring(0,i);
            queryString=rest.substring(i+1);
        }
        System.out.println(path);
        System.out.println(queryString);
    }
}
